/**
 * 密码加密工具类
 * 使用SHA-256进行前端哈希，防止明文传输
 */

class PasswordUtils {
  /**
   * 对密码进行SHA-256哈希
   * @param {string} password - 明文密码
   * @returns {Promise<string>} 哈希后的密码（十六进制字符串）
   */
  static async hashPassword(password) {
    try {
      // 将字符串转换为Uint8Array
      const encoder = new TextEncoder();
      const data = encoder.encode(password);
      
      // 使用Web Crypto API进行SHA-256哈希
      const hashBuffer = await crypto.subtle.digest('SHA-256', data);
      
      // 将ArrayBuffer转换为十六进制字符串
      const hashArray = Array.from(new Uint8Array(hashBuffer));
      const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
      
      return hashHex;
    } catch (error) {
      console.error('密码哈希失败:', error);
      throw new Error('密码处理失败');
    }
  }

  /**
   * 验证密码强度（前端验证，减少无效请求）
   * @param {string} password - 明文密码
   * @returns {boolean} 是否通过验证
   */
  static validatePasswordStrength(password) {
    if (!password) return false;
    
    const hasUpperCase = /[A-Z]/.test(password);
    const hasLowerCase = /[a-z]/.test(password);
    const hasNumbers = /\d/.test(password);
    const hasSpecialChar = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password);
    
    return password.length >= 8 && 
           hasUpperCase && 
           hasLowerCase && 
           hasNumbers && 
           hasSpecialChar;
  }

  /**
   * 生成随机盐值（用于扩展安全性）
   * @returns {string} 随机盐值
   */
  static generateSalt() {
    const array = new Uint8Array(16);
    crypto.getRandomValues(array);
    return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
  }
}

export default PasswordUtils;